/**
 *  一句话思路：模拟题，通过x,y坐标对二维数组进行填充。碰到两种情况会特殊处理：1. 位置被占 2. 越界
    解决所需数据结构+算法：二维数组
**/
#include<iostream>
#include<cstring>
using namespace std;

int a[40][40];

int main() {
    memset(a, 0, sizeof(a));
    int n, x, y;
    cin >> n;
    x = 0, y = n / 2; // 坐标位从0开始（当然你也可以从1开始，公式会比较难思考）
    for(int i=1; i<= n*n; i++) {
        a[x][y] = i;
        int xx = (x - 1 + n) % n;
        int yy = (y + 1 + n) % n;
        if(!a[xx][yy]) {
            x = xx, y = yy;
        } else {
            x = (x + 1 + n) % n;
        }
    }

    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }

    return 0;
}